괄호 회전하기
📔 문제 설명
다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
(), [], {} 는 모두 올바른 괄호 문자열입니다.
만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.
📓 제약 조건
s의 길이는 1 이상 1,000 이하입니다.
📓 입출력의 예
s | result |
---|---|
"[](){}" |
3 |
"}]()[{" |
2 |
"[)(]" |
0 |
"}}}" |
0 |
❗ 1번째
문제에서 괄호의 종류가 3개가 있다는점
, 문자열을 회전 시키는 로직
, 괄호의 짝을 맞추는 과정
을 생각하고 풀이를 해보면 좋을거같다.
먼저 문자열을 회전하는 로직은 for문을 통해서 slice문으로 작성해서 회전시키는 배열을 계속 만들어주고 그걸 다시 스택 함수에 넣어서 동작하게한뒤에 카운트를 true false 값으로 리턴시킨뒤 카운트를 모아 리턴해주는 방식으로 작성했습니다.
✅ 실행 코드
function 스택(str){
const stack = [];
for (const s of str){
if(s === '(' || s === '[' || s === '{'){
stack.push(s);
}else{
const last = stack.pop();
if(
(s===')' && last !== '(') ||
(s===']' && last !== '[') ||
(s==='}' && last !== '{')
){
return false
}
}
}
return stack.length === 0;
}
function solution(s){
let cnt = 0;
for(let i = 0; i < s.length; i++){
const 회전 = s.slice(i) + s.slice(0,i);
if(스택(회전)) cnt++;
}
return cnt;
}
📚 문제 느낀점
처음에 회전하는 방법에 대해서 조금 헷갈렸는데 이걸 진짜로 회전하면서 할지 혹은 인덱스를 활용해서 돌아가는 순서에 대한 로직을 작성후 풀어볼지에 대해서 고민을 많이했는데 결국 걸리는 시간이 같을거같지만 그래도 이 방식이 조금 더 자원소모값이 많은거같아 인덱스를 활용한 방법도 한번 더 풀어보면 좋을거같다.
© 문제 출처
https://school.programmers.co.kr/learn/courses/30/lessons/76502